/**************************************
 * 日期处理工具
 * @author Xiaopeng
 * @date 2014-07-30
 * @refer 
 **************************************/

/**
 * JS闭包实现JS日期工具的封装
 * 此工具包依赖CommonUtils.js
 * 说明：外部、内部函数调用的方法，如DateUtils.isDate(_str)
 */
var DateUtils = {
		/**
		 * 判断是否是日期
		 * @param date 日期
		 * @param fmt 日期格式
		 * @returns {Boolean} 如果通过验证返回true,否则返回false
		 */
		isDate: function(date, fmt) { 
			if (fmt == null) {
				fmt="yyyyMMdd"; 
			}
			var yIndex = fmt.indexOf("yyyy"); 
			if(yIndex == -1) {
				return false; 
			}
			var year = date.substring(yIndex, yIndex+4); 
			var mIndex = fmt.indexOf("MM"); 
			if(mIndex == -1) {
				return false;
			} 
			var month = date.substring(mIndex,mIndex+2); 
			var dIndex = fmt.indexOf("dd"); 
			if(dIndex == -1) {
				return false;
			} 
			var day = date.substring(dIndex, dIndex+2); 
			if(!CommonUtils.isNumber(year) || year>"2100" || year< "1900") {
				return false;
			} 
			if(!CommonUtils.isNumber(month) || month>"12" || month< "01") {
				return false;
			} 
			if(day>DateUtils.getMaxDay(year,month) || day< "01") {
				return false;
			} 
			return true; 
		},
		
		/**
		 * 检查是否通用的日期格式，如2014-07-19或2014-7-19
		 * @param date
		 * @returns {Boolean} 如果通过验证返回true,否则返回false
		 */
		isSimpleDate: function(date) {
			var regu = "^(\d{4})-(\d{1,2})-(\d{1,2})$";   
			var re = new RegExp(regu); 
			if (re.test(date)) { 
				return true; 
			}
			return false;
		},
		
		/**
		 * 检查是否通用的日期时间格式，如：2014-07-30 15:52:00
		 * @param dateTime
		 * @returns {Boolean}
		 */
		isChinaDateTime: function(dateTime) {
			var regu = "^(?:19|20)[0-9][0-9]-(?:(?:0[1-9])|(?:1[0-2]))-(?:(?:[0-2][1-9])|(?:[1-3][0-1])) (?:(?:[0-2][0-3])|(?:[0-1][0-9])):[0-5][0-9]:[0-5][0-9]$";   
			var re = new RegExp(regu); 
			if (re.test(dateTime)) { 
				return true; 
			}
			return false;
		},
		
		/**
		 * 获取当月最大天数
		 * @param year
		 * @param month
		 * @returns {String}
		 */
		getMaxDay: function(year,month) { 
			if(month==4 || month==6 || month==9 || month==11)  {
				return "30"; 
			}
			//2月根据当年是否闰年判断天数
			if(month == 2) {
				if(year%4==0 && year%100!=0 || year%400==0) {
					return "29";
				}
				return "28"; 
			}
			return "31"; 
		},
		
		/**
		 * 检查输入的起止日期是否正确，规则为两个日期的格式正确，且结束如期>=起始日期 
		 * @param startDate 起始日期，字符串
		 * @param endDate 结束如期，字符串
		 * @returns {Number}
		 * 0: 校验无误；
		 * 1: 起始日期不正确；
		 * 2: 终止日期不正确；
		 * 3: 起始日期不能大于终止日期
		 */
		checkTwoDate: function(startDate, endDate) { 
			if(!DateUtils.isDate(startDate)) { 
				return 1; 
			} else if(!DateUtils.isDate(endDate)) { 
				return 2; 
			} else if(startDate > endDate) { 
				return 3; 
			} 
			return 0; 
		},
		
		/**
		 * 将String类型解析为Date类型
		 * 注意：如果使用JS库函数Date.parse，时间格式必须是MM/dd/yyyy HH:mm:ss
		 * parseDate('2006-1-1') return new Date(2006,0,1)
		 * parseDate(' 2006-1-1 ') return new Date(2006,0,1)
		 * parseDate('2006-1-1 15:14:16') return new Date(2006,0,1,15,14,16) 
		 * parseDate(' 2006-1-1 15:14:16 ') return new Date(2006,0,1,15,14,16)
		 * parseDate('2006-1-1 15:14:16.254') return new Date(2006,0,1,15,14,16,254)
		 * parseDate(' 2006-1-1 15:14:16.254 ') return new Date(2006,0,1,15,14,16,254)
		 * parseDate('不正确的格式') retrun null
		 * @param str 日期时间字符串
		 * @returns {Date}
		 * @date 2015-01-06
		 */
		parseDate: function(str){   
			if(typeof str == 'string'){
				//yyyy-MM-dd或yyyy/MM/dd
				var results = str.match(/^ *(\d{4})[-\/](\d{1,2})[-\/](\d{1,2}) *$/);   
			    if(results && results.length>3) {
			    	return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]));
			    } 
			    //yyyy-MM-dd HH:mm:ss或yyyy/MM/dd HH:mm:ss
			    results = str.match(/^ *(\d{4})[-\/](\d{1,2})[-\/](\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2}) *$/);   
			    if(results && results.length>6) {
			    	return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]),parseInt(results[4]),parseInt(results[5]),parseInt(results[6]));
			    }
			    //yyyy-MM-dd HH:mm:ss.S或yyyy/MM/dd HH:mm:ss.S  
			    results = str.match(/^ *(\d{4})[-\/](\d{1,2})[-\/](\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,9}) *$/);   
			    if(results && results.length>7) {
			    	return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]),parseInt(results[4]),parseInt(results[5]),parseInt(results[6]),parseInt(results[7]));
			    }
			}   
			return null;   
		}
}

/**      
 * 对Date的扩展，将 Date 转化为指定格式的String      
 * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2 个占位符      
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)      
 * eg:      
 * (new Date()).format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423      
 * (new Date()).format("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04      
 * (new Date()).format("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04      
 * (new Date()).format("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04      
 * (new Date()).format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18      
 */        
Date.prototype.format=function(fmt) {         
    var o = {         
	    "M+" : this.getMonth()+1, //月份         
	    "d+" : this.getDate(), //日         
	    "h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时         
	    "H+" : this.getHours(), //小时         
	    "m+" : this.getMinutes(), //分         
	    "s+" : this.getSeconds(), //秒         
	    "q+" : Math.floor((this.getMonth()+3)/3), //季度         
	    "S" : this.getMilliseconds() //毫秒         
    };         
    var week = {         
	    "0" : "/u65e5",         
	    "1" : "/u4e00",         
	    "2" : "/u4e8c",         
	    "3" : "/u4e09",         
	    "4" : "/u56db",         
	    "5" : "/u4e94",         
	    "6" : "/u516d"        
    };         
    if(/(y+)/.test(fmt)){         
        fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));         
    }         
    if(/(E+)/.test(fmt)){         
        fmt=fmt.replace(RegExp.$1, ((RegExp.$1.length>1) ? (RegExp.$1.length>2 ? "/u661f/u671f" : "/u5468") : "")+week[this.getDay()+""]);         
    }         
    for(var k in o){         
        if(new RegExp("("+ k +")").test(fmt)){         
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));         
        }         
    }         
    return fmt;         
}

Date.prototype.addDays = function(d) {
    this.setDate(this.getDate() + d);
}

Date.prototype.addWeeks = function(w) {
    this.addDays(w * 7);
}

Date.prototype.addMonths= function(m) {
    var d = this.getDate();
    this.setMonth(this.getMonth() + m);
    if (this.getDate() < d)
        this.setDate(0);
}

Date.prototype.addYears = function(y) {
    var m = this.getMonth();
    this.setFullYear(this.getFullYear() + y);
    if (m < this.getMonth()) {
        this.setDate(0);
     }
}

Date.prototype.getMaxDay = function(year,month) { 
	if(month==4 || month==6 || month==9 || month==11)  {
		return "30"; 
	}
	//2月根据当年是否闰年判断天数
	if(month == 2) {
		if(year%4==0 && year%100!=0 || year%400==0) {
			return "29";
		}
		return "28"; 
	}
	return "31"; 
} 